package com.neighbor.neighborhooduser.controller;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.neighbor.neighborhooduser.pojo.UserItems;
import com.neighbor.neighborhooduser.pojo.Users;
import com.neighbor.neighborhooduser.service.IUserItemsService;
import com.neighbor.neighborhooduser.utils.ReOpe;
import com.neighbor.neighborhooduser.utils.ResponseMsg;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.net.URLDecoder;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;

/**
 * <p>
 * 用户物品表 前端控制器
 * </p>
 *
 * @author song
 * @since 2025-09-22 09:13:04
 */
@RestController
@RequestMapping("/userItems")
public class UserItemsController {
        @Autowired
    ReOpe reOpe;

    @Autowired
    IUserItemsService userItemsService;

    @RequestMapping("add")
    ResponseMsg add(@RequestBody UserItems userItems, HttpServletRequest request){
        ResponseMsg responseMsg = reOpe.IsToken(request);
        if(responseMsg.getCode() == ResponseMsg.SUCCESS){
            Users user = (Users) responseMsg.getData();
            userItems.setUserId(user.getUserId());
            return userItemsService.save(userItems)?ResponseMsg.getInstance(ResponseMsg.SUCCESS,"发布商品成功"):
                    ResponseMsg.getInstance(ResponseMsg.DATA_ERROR,"发布失败");
        }
        return responseMsg;
    }

    /**
     * 通过用户ID和状态获取该用户发布的物品列表
     * @param userId 用户ID
     * @param status 当前状态
     * @return 相对应状态的List
     */

    @RequestMapping("getItemsListByUid/{userId}/{status}")
    ResponseMsg getItemsByUid(
            @PathVariable Integer userId,
            @PathVariable Byte status) {

        // 1. 验证用户ID是否有效
        if (userId == null || userId < 0) {
            return ResponseMsg.getInstance(ResponseMsg.DATA_ERROR, "用户ID无效");
        }

        // 2. 验证状态值是否合法
        if (status < 0 || status > 3) {
            return ResponseMsg.getInstance(ResponseMsg.DATA_ERROR,
                    "状态值无效（1-已上架, 2-已下架）");
        }

        try {
            // 3. 创建QueryWrapper
            QueryWrapper<UserItems> queryWrapper = new QueryWrapper<>();
            if (status == 0){
                queryWrapper.eq("user_id", userId); // 按用户ID筛选
            }else {
                queryWrapper.eq("user_id", userId); // 按用户ID筛选
                queryWrapper.eq("status", status);  // 按状态筛选
            }

            // 4. 调用Service层获取物品列表
            List<UserItems> items = userItemsService.list(queryWrapper);

            // 5. 处理查询结果
            if (items == null || items.isEmpty()) {
                return ResponseMsg.getInstance(ResponseMsg.SUCCESS,
                        "该用户没有状态为" + getStatusName(status) + "的物品", new ArrayList<UserItems>());
            }

            return ResponseMsg.getInstance(ResponseMsg.SUCCESS, items);

        } catch (Exception e) {
            // 6. 异常处理
            return ResponseMsg.getInstance(ResponseMsg.REQUEST_ERROR, "查询失败: " + e.getMessage());
        }
    }


    // 辅助方法：获取状态名称
    private String getStatusName(Byte status) {
        switch (status) {
            case 1: return "已上架";
            case 2: return "已下架";
            default: return "未知状态";
        }
    }


    /**
     * 通过物品标题模糊查询物品列表（路径参数版）
     *
     * 本接口根据传入的物品标题关键字进行模糊查询，返回匹配的物品列表。
     *
     * @param title 物品标题关键字，路径变量
     *              - 需要URL编码（前端需对中文进行编码）
     * @param page  当前页码，路径变量（可选，默认1）
     * @param size  每页数量，路径变量（可选，默认10）
     * @return ResponseMsg 响应消息对象
     */
    @RequestMapping("getListLikeTitle/{title}/{page}/{size}")
    ResponseMsg getListLikeTitle(
            @PathVariable String title,
            @PathVariable(required = false) Integer page,
            @PathVariable(required = false) Integer size) {

        try {
            // 1. 解码URL编码的标题
            String decodedTitle = URLDecoder.decode(title, StandardCharsets.UTF_8);

            // 2. 处理分页参数默认值
            int pageNum = (page == null || page <= 0) ? 1 : page;
            int pageSize = (size == null || size <= 0) ? 10 : size;

            // 3. 验证关键字
            if (decodedTitle == null || decodedTitle.trim().isEmpty()) {
                return ResponseMsg.getInstance(ResponseMsg.DATA_ERROR, "请输入查询关键字");
            }

            // 4. 处理关键字（防止SQL注入）
            String safeTitle = decodedTitle.trim().replace("%", "\\%").replace("_", "\\_");

            // 5. 创建查询包装器
            QueryWrapper<UserItems> queryWrapper = new QueryWrapper<>();
            queryWrapper.like("title", safeTitle)
                    .orderByDesc("updated_at");

            // 6. 创建分页对象
            Page<UserItems> pageInfo = new Page<>(pageNum, pageSize);

            // 7. 执行分页查询
            IPage<UserItems> itemsPage = userItemsService.page(pageInfo, queryWrapper);

            // 8. 处理查询结果
            if (itemsPage.getRecords().isEmpty()) {
                return ResponseMsg.getInstance(ResponseMsg.SUCCESS, "未找到匹配的物品");
            }

            // 9. 返回分页结果
            return ResponseMsg.getInstance(ResponseMsg.SUCCESS, itemsPage);

        } catch (Exception e) {
            return ResponseMsg.getInstance(ResponseMsg.DATA_ERROR, "查询失败: " + e.getMessage());
        }
    }


    /**
     * 物品状态切换（上架/下架）
     * @param operation 操作类型（up:上架, down:下架）
     * @param itemId 物品ID
     * @param status 当前状态
     * @return 操作结果
     */
    @RequestMapping("changeStatus/{operation}/{itemId}/{status}")
    ResponseMsg changeItemStatus(
            @PathVariable String operation,
            @PathVariable Integer itemId,
            @PathVariable Byte status) {

        // 1. 验证参数
        if (itemId == null || itemId <= 0) {
            return ResponseMsg.getInstance(ResponseMsg.DATA_ERROR, "物品ID无效");
        }

        // 2. 确定操作类型和目标状态
        Byte targetStatus;
        String successMessage;
        String alreadyMessage;

        if ("up".equalsIgnoreCase(operation)) {
            // 上架操作：目标状态为1（上架）
            targetStatus = 1;
            successMessage = "上架成功";
            alreadyMessage = "物品已经上架了";
        } else if ("down".equalsIgnoreCase(operation)) {
            // 下架操作：目标状态为2（下架）
            targetStatus = 2;
            successMessage = "下架成功";
            alreadyMessage = "物品已经下架了";
        } else {
            return ResponseMsg.getInstance(ResponseMsg.DATA_ERROR, "无效的操作类型");
        }

        // 3. 检查当前状态是否已经是目标状态
        if (status.equals(targetStatus)) {
            return ResponseMsg.getInstance(ResponseMsg.DATA_ERROR, alreadyMessage);
        }

        try {
            // 4. 创建并执行更新
            UpdateWrapper<UserItems> wrapper = new UpdateWrapper<>();
            wrapper.eq("item_id", itemId)
                    .set("status", targetStatus);

            boolean success = userItemsService.update(wrapper);

            if (success) {
                return ResponseMsg.getInstance(ResponseMsg.SUCCESS, successMessage);
            } else {
                return ResponseMsg.getInstance(ResponseMsg.DATA_ERROR, "操作失败");
            }

        } catch (Exception e) {
            return ResponseMsg.getInstance(ResponseMsg.DATA_ERROR, "操作异常: " + e.getMessage());
        }
    }


    /**
     * 编辑物品信息接口
     * @param item 物品对象，包含需要更新的字段信息
     *             - 必须包含有效的物品ID
     *             - 可以包含物品名称、描述、状态等字段
     * @return ResponseMsg 响应消息对象
     *         - 成功：返回SUCCESS状态码和操作结果（true/false）
     *         - 失败：返回错误状态码和错误信息
     */
    @RequestMapping("editItem")
    ResponseMsg editItem(@RequestBody UserItems item) {
        return ResponseMsg.getInstance(ResponseMsg.SUCCESS, userItemsService.updateById(item));
    }

    /**
     * 获取物品详细信息接口
     * 本接口根据物品ID查询物品的完整详细信息。
     * 使用场景：
     * - 用户查看自己发布的物品详情
     * - 用户浏览物品详情页面
     * - 管理员查看物品信息
     * @param itemId 物品ID，路径变量
     *               - 必须是有效的正整数
     * @return ResponseMsg 响应消息对象
     *         - 成功：返回SUCCESS状态码和物品详细信息
     *         - 失败：返回错误状态码和错误信息
     */
    @RequestMapping("getItemById/{itemId}")
    ResponseMsg getItemById(@PathVariable Integer itemId) {
        // 实际实现中应添加参数校验
        return ResponseMsg.getInstance(ResponseMsg.SUCCESS, userItemsService.getById(itemId));
    }



    //获取所有的用户物品集合
    @RequestMapping("/page")
    IPage<UserItems> getPage(@RequestParam(defaultValue = "1") Integer page,
                              Integer size,
                             @RequestParam(defaultValue = "") String keyword,
                             @RequestParam(defaultValue = "0")Integer categoryId){
        IPage<UserItems> iPage = new Page<>(page,size);
        QueryWrapper<UserItems> wrapper = new QueryWrapper<>();
        if (keyword != null && !keyword.isEmpty()) {
            wrapper.like("description", keyword)
                    .or()
                    .like("title", keyword);
        }
        wrapper.eq("status", 1);
        if (categoryId != null && categoryId != 0) {
            wrapper.eq("category_id", categoryId);
        }
        return userItemsService.getPage(iPage,wrapper);
    }
    //通过id获取userItems对象
    @RequestMapping("/getById")
    UserItems getById(Integer id){
        return userItemsService.getById(id);
    }
    //获取每个物品的浏览量
    @RequestMapping("/viewCount")
    ResponseMsg addViewCount(Integer id){
        if(userItemsService.addViewCount(id)==1){
            return ResponseMsg.success();
        }
        return ResponseMsg.getInstance(ResponseMsg.DATA_ERROR,"错误");
    }
    //修改物品状态
    @RequestMapping("/updateStatus")
    ResponseMsg updateStatus(Integer id){
        if(userItemsService.updateStatus(id)==1){
            return ResponseMsg.success();
        }
        return ResponseMsg.getInstance(ResponseMsg.DATA_ERROR,"错误");
    }
}
